﻿using Ebusiness_UserService.Data;
using Ebusiness_UserService.DomainEvent.User;
using Ebusiness_UserService.Repositorys;
using MediatR;
using Microsoft.Extensions.DependencyInjection;
using Newtonsoft.Json;
using Volo.Abp.Domain.Repositories;
using Volo.Abp.Uow;

namespace Ebusiness_UserService.Services.Event
{
    /// <summary>
    /// 应用层是非常薄的一层，应用层主要进行安全认证、权限校验、数据校验、事务控制、工作单元控制、领域服务的调用等。从理论上来讲，应用层中不应该有业务规则或者业务逻辑。
    /// 
    /// 应用层主要进行的是数据的校验、请求数据的获取、领域服务返回值的显示等处理，并没有复杂的业务逻辑，因为主要的业务逻辑都被封装在领域层。
    /// 
    /// 监听登录失败或者成功的领域事件UserAccessResultEvent，记录到LoginHistory:repository.AddNewLoginHistoryAsync(phoneNum,msg);
    /// </summary>
    public class UserAccessResultEventHandler : INotificationHandler<UserAccessResultEvent>
    {

        //public IServiceProvider Service { get; set; }

        public IServiceScopeFactory _serviceScopeFactory { get; set; }

        public IUserLoginHistoryRepository userLoginHistoryRepository1 { get; set; }

        /// <summary>
        /// 响应领域事件
        /// </summary>
        /// <param name="notification"></param>
        /// <param name="cancellationToken"></param>
        /// <returns></returns>
        /// <exception cref="NotImplementedException"></exception>
        public async Task Handle(UserAccessResultEvent notification, CancellationToken cancellationToken)
        {
            //using (var scope = _serviceScopeFactory.CreateScope())
            //{
            //    IUnitOfWorkManager uow = scope.ServiceProvider.GetRequiredService<IUnitOfWorkManager>();
            //    using (var unitOfWork = uow.Begin(requiresNew: true))
            //    {
            //        IUserLoginHistoryRepository userLoginHistoryRepository = scope.ServiceProvider.GetRequiredService<IUserLoginHistoryRepository>();
            //        await userLoginHistoryRepository.AddNewLoginHistoryAsync(notification.PhoneNumber, $"登录结果是:{notification.Result}");
            //        await unitOfWork.CompleteAsync(); // ✅ 必须手动提交
            //    }
            //}

           await userLoginHistoryRepository1.AddNewLoginHistoryAsync(notification.PhoneNumber, $"登录结果是:{notification.Result}");
        }
    }
}
